<!DOCTYPE html>



  


<html class="theme-next muse use-motion" lang="zh-Hans">
<head>
  <meta charset="UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1"/>
<meta name="theme-color" content="#222">









<meta http-equiv="Cache-Control" content="no-transform" />
<meta http-equiv="Cache-Control" content="no-siteapp" />
















  
  
  <link href="/blog/lib/fancybox/source/jquery.fancybox.css?v=2.1.5" rel="stylesheet" type="text/css" />







<link href="/blog/lib/font-awesome/css/font-awesome.min.css?v=4.6.2" rel="stylesheet" type="text/css" />

<link href="/blog/css/main.css?v=5.1.4" rel="stylesheet" type="text/css" />


  <link rel="apple-touch-icon" sizes="180x180" href="/blog/images/apple-touch-icon-next.png?v=5.1.4">


  <link rel="icon" type="image/png" sizes="32x32" href="/blog/images/favicon-32x32-next.png?v=5.1.4">


  <link rel="icon" type="image/png" sizes="16x16" href="/blog/images/favicon-16x16-next.png?v=5.1.4">


  <link rel="mask-icon" href="/blog/images/logo.svg?v=5.1.4" color="#222">





  <meta name="keywords" content="Hexo, NexT" />










<meta property="og:type" content="website">
<meta property="og:title" content="smallmuou&#39;s blog">
<meta property="og:url" content="http://smallmuou.gitee.io/blog/page/15/index.html">
<meta property="og:site_name" content="smallmuou&#39;s blog">
<meta property="og:locale" content="zh-Hans">
<meta name="twitter:card" content="summary">
<meta name="twitter:title" content="smallmuou&#39;s blog">



<script type="text/javascript" id="hexo.configurations">
  var NexT = window.NexT || {};
  var CONFIG = {
    root: '/blog/',
    scheme: 'Muse',
    version: '5.1.4',
    sidebar: {"position":"left","display":"post","offset":12,"b2t":false,"scrollpercent":false,"onmobile":false},
    fancybox: true,
    tabs: true,
    motion: {"enable":true,"async":false,"transition":{"post_block":"fadeIn","post_header":"slideDownIn","post_body":"slideDownIn","coll_header":"slideLeftIn","sidebar":"slideUpIn"}},
    duoshuo: {
      userId: '0',
      author: '博主'
    },
    algolia: {
      applicationID: '',
      apiKey: '',
      indexName: '',
      hits: {"per_page":10},
      labels: {"input_placeholder":"Search for Posts","hits_empty":"We didn't find any results for the search: ${query}","hits_stats":"${hits} results found in ${time} ms"}
    }
  };
</script>



  <link rel="canonical" href="http://smallmuou.gitee.io/blog/page/15/"/>





  <title>smallmuou's blog</title>
  








</head>

<body itemscope itemtype="http://schema.org/WebPage" lang="zh-Hans">

  
  
    
  

  <div class="container sidebar-position-left 
  page-home">
    <div class="headband"></div>

    <header id="header" class="header" itemscope itemtype="http://schema.org/WPHeader">
      <div class="header-inner"><div class="site-brand-wrapper">
  <div class="site-meta ">
    

    <div class="custom-logo-site-title">
      <a href="/blog/"  class="brand" rel="start">
        <span class="logo-line-before"><i></i></span>
        <span class="site-title">smallmuou's blog</span>
        <span class="logo-line-after"><i></i></span>
      </a>
    </div>
      
        <p class="site-subtitle"><a href="https://github.com/smallmuou">https://github.com/smallmuou</a></p>
      
  </div>

  <div class="site-nav-toggle">
    <button>
      <span class="btn-bar"></span>
      <span class="btn-bar"></span>
      <span class="btn-bar"></span>
    </button>
  </div>
</div>

<nav class="site-nav">
  

  
    <ul id="menu" class="menu">
      
        
        <li class="menu-item menu-item-home">
          <a href="/blog/" rel="section">
            
              <i class="menu-item-icon fa fa-fw fa-home"></i> <br />
            
            首页
          </a>
        </li>
      
        
        <li class="menu-item menu-item-archives">
          <a href="/blog/archives/" rel="section">
            
              <i class="menu-item-icon fa fa-fw fa-archive"></i> <br />
            
            归档
          </a>
        </li>
      
        
        <li class="menu-item menu-item-categories">
          <a href="/blog/categories/" rel="section">
            
              <i class="menu-item-icon fa fa-fw fa-th"></i> <br />
            
            分类
          </a>
        </li>
      
        
        <li class="menu-item menu-item-about">
          <a href="/blog/about/" rel="section">
            
              <i class="menu-item-icon fa fa-fw fa-user"></i> <br />
            
            关于
          </a>
        </li>
      

      
    </ul>
  

  
</nav>



 </div>
    </header>

    <main id="main" class="main">
      <div class="main-inner">
        <div class="content-wrap">
          <div id="content" class="content">
            
  <section id="posts" class="posts-expand">
    
      

  

  
  
  

  <article class="post post-type-normal" itemscope itemtype="http://schema.org/Article">
  
  
  
  <div class="post-block">
    <link itemprop="mainEntityOfPage" href="http://smallmuou.gitee.io/blog/blog/2015/11/03/2015-11-03-MACOSX命令行发送邮件/">

    <span hidden itemprop="author" itemscope itemtype="http://schema.org/Person">
      <meta itemprop="name" content="smallmuou">
      <meta itemprop="description" content="">
      <meta itemprop="image" content="/blog/images/avatar.gif">
    </span>

    <span hidden itemprop="publisher" itemscope itemtype="http://schema.org/Organization">
      <meta itemprop="name" content="smallmuou's blog">
    </span>

    
      <header class="post-header">

        
        
          <h1 class="post-title" itemprop="name headline">
                
                <a class="post-title-link" href="/blog/2015/11/03/2015-11-03-MACOSX命令行发送邮件/" itemprop="url">MACOSX命令行发送邮件</a></h1>
        

        <div class="post-meta">
          <span class="post-time">
            
              <span class="post-meta-item-icon">
                <i class="fa fa-calendar-o"></i>
              </span>
              
                <span class="post-meta-item-text">发表于</span>
              
              <time title="创建于" itemprop="dateCreated datePublished" datetime="2015-11-03T00:00:00+08:00">
                2015-11-03
              </time>
            

            

            
          </span>

          
            <span class="post-category" >
            
              <span class="post-meta-divider">|</span>
            
              <span class="post-meta-item-icon">
                <i class="fa fa-folder-o"></i>
              </span>
              
                <span class="post-meta-item-text">分类于</span>
              
              
                <span itemprop="about" itemscope itemtype="http://schema.org/Thing">
                  <a href="/blog/categories/SHELL/" itemprop="url" rel="index">
                    <span itemprop="name">SHELL</span>
                  </a>
                </span>

                
                
              
            </span>
          

          

          
          

          

          

          

        </div>
      </header>
    

    
    
    
    <div class="post-body" itemprop="articleBody">

      
      

      
        
          
            <p>最近准备打一个iOS APP自动化发布环境，在发布完后需要通知测试人员，于是考虑邮件通知，但又不可能人工方式（不（tai）智（lan）能（le）），于是就找找有没有命令行下发送邮件，果真找到了很多，有telnet、mail、sendmail等等，本文选择了一个最简单的方法.</p>
<h3 id="安装"><a href="#安装" class="headerlink" title="安装"></a>安装</h3><p>本文采用了msmtp来发送邮件，可以通过brew很容易安装</p>
<pre>
sudo brew install msmtp
</pre>

<h3 id="配置"><a href="#配置" class="headerlink" title="配置"></a>配置</h3><p>vim ~/.msmtprc</p>
<pre>
defaults
logfile ~/.msmtp.log 
account test
# SMTP邮件服务器地址
host mail.126.com
# 发送的邮件Email
from xxxxxx@126.com
auth login
# 邮件服务器登录账号
user xxxxxxx@126.com
# 邮件服务器登陆密码
password xxxxxx
# Set a default account
account default: test
</pre>

<h3 id="测试"><a href="#测试" class="headerlink" title="测试"></a>测试</h3><pre>
msmtp xxxx@126.com
</pre>
输入如下内容，并按Ctrl+D,查看是否收到邮件,（亲测可以收到）
<pre>
Subject:Hello
hello world!!!!
</pre>
PS: 代码敲多了，老hello world ^~^

当然可用如下脚本
<pre>
msmtp xxxx@126.com << EOF
Subject:hello
hello world
EOF
</pre>

          
        
      
    </div>
    
    
    

    

    

    

    <footer class="post-footer">
      

      

      

      
      
        <div class="post-eof"></div>
      
    </footer>
  </div>
  
  
  
  </article>


    
      

  

  
  
  

  <article class="post post-type-normal" itemscope itemtype="http://schema.org/Article">
  
  
  
  <div class="post-block">
    <link itemprop="mainEntityOfPage" href="http://smallmuou.gitee.io/blog/blog/2015/11/03/2015-11-03-命令行生成二维码/">

    <span hidden itemprop="author" itemscope itemtype="http://schema.org/Person">
      <meta itemprop="name" content="smallmuou">
      <meta itemprop="description" content="">
      <meta itemprop="image" content="/blog/images/avatar.gif">
    </span>

    <span hidden itemprop="publisher" itemscope itemtype="http://schema.org/Organization">
      <meta itemprop="name" content="smallmuou's blog">
    </span>

    
      <header class="post-header">

        
        
          <h1 class="post-title" itemprop="name headline">
                
                <a class="post-title-link" href="/blog/2015/11/03/2015-11-03-命令行生成二维码/" itemprop="url">命令行生成二维码</a></h1>
        

        <div class="post-meta">
          <span class="post-time">
            
              <span class="post-meta-item-icon">
                <i class="fa fa-calendar-o"></i>
              </span>
              
                <span class="post-meta-item-text">发表于</span>
              
              <time title="创建于" itemprop="dateCreated datePublished" datetime="2015-11-03T00:00:00+08:00">
                2015-11-03
              </time>
            

            

            
          </span>

          
            <span class="post-category" >
            
              <span class="post-meta-divider">|</span>
            
              <span class="post-meta-item-icon">
                <i class="fa fa-folder-o"></i>
              </span>
              
                <span class="post-meta-item-text">分类于</span>
              
              
                <span itemprop="about" itemscope itemtype="http://schema.org/Thing">
                  <a href="/blog/categories/SHELL/" itemprop="url" rel="index">
                    <span itemprop="name">SHELL</span>
                  </a>
                </span>

                
                
              
            </span>
          

          

          
          

          

          

          

        </div>
      </header>
    

    
    
    
    <div class="post-body" itemprop="articleBody">

      
      

      
        
          
            <p>为了实现自动化，有时我们希望在脚本中生成二维码的需求，因此需要支持生成二维码的命令，通过Google发现qrencode可以达到要求.</p>
<h3 id="安装"><a href="#安装" class="headerlink" title="安装"></a>安装</h3><pre>
sudo brew install qrencode
</pre>

<h3 id="使用"><a href="#使用" class="headerlink" title="使用"></a>使用</h3><pre>
qrencode -o file.png https://www.baidu.com
</pre>

          
        
      
    </div>
    
    
    

    

    

    

    <footer class="post-footer">
      

      

      

      
      
        <div class="post-eof"></div>
      
    </footer>
  </div>
  
  
  
  </article>


    
      

  

  
  
  

  <article class="post post-type-normal" itemscope itemtype="http://schema.org/Article">
  
  
  
  <div class="post-block">
    <link itemprop="mainEntityOfPage" href="http://smallmuou.gitee.io/blog/blog/2015/10/27/2015-10-27-iOS 9.0.x UIScrollView崩溃BUG/">

    <span hidden itemprop="author" itemscope itemtype="http://schema.org/Person">
      <meta itemprop="name" content="smallmuou">
      <meta itemprop="description" content="">
      <meta itemprop="image" content="/blog/images/avatar.gif">
    </span>

    <span hidden itemprop="publisher" itemscope itemtype="http://schema.org/Organization">
      <meta itemprop="name" content="smallmuou's blog">
    </span>

    
      <header class="post-header">

        
        
          <h1 class="post-title" itemprop="name headline">
                
                <a class="post-title-link" href="/blog/2015/10/27/2015-10-27-iOS 9.0.x UIScrollView崩溃BUG/" itemprop="url">iOS 9.0.x UIScrollView崩溃BUG</a></h1>
        

        <div class="post-meta">
          <span class="post-time">
            
              <span class="post-meta-item-icon">
                <i class="fa fa-calendar-o"></i>
              </span>
              
                <span class="post-meta-item-text">发表于</span>
              
              <time title="创建于" itemprop="dateCreated datePublished" datetime="2015-10-27T00:00:00+08:00">
                2015-10-27
              </time>
            

            

            
          </span>

          
            <span class="post-category" >
            
              <span class="post-meta-divider">|</span>
            
              <span class="post-meta-item-icon">
                <i class="fa fa-folder-o"></i>
              </span>
              
                <span class="post-meta-item-text">分类于</span>
              
              
                <span itemprop="about" itemscope itemtype="http://schema.org/Thing">
                  <a href="/blog/categories/IOS/" itemprop="url" rel="index">
                    <span itemprop="name">IOS</span>
                  </a>
                </span>

                
                
              
            </span>
          

          

          
          

          

          

          

        </div>
      </header>
    

    
    
    
    <div class="post-body" itemprop="articleBody">

      
      

      
        
          
            <p>前段时间在分析一个崩溃bug，发现原来iOS9.0.x的UIScrollView有一个bug，具体表现为，当我继承UIScrollView，并重写setDelegate方法，如下:</p>
<pre>
- (void)setDelegate:(id)delegate {
    [super setDelegate:self];
}
</pre>
当调用.delegate=xxx，就会出现如下崩溃信息:
<pre>
objc[88233]: Cannot form weak reference to instance (0x7fc37c857400) of class TestScrollView. It is possible that this object was over-released, or is in the process of deallocation.</pre>

<p>当然也在iOS8上测试，是没问题的，目前已反馈给Apple.</p>

          
        
      
    </div>
    
    
    

    

    

    

    <footer class="post-footer">
      

      

      

      
      
        <div class="post-eof"></div>
      
    </footer>
  </div>
  
  
  
  </article>


    
      

  

  
  
  

  <article class="post post-type-normal" itemscope itemtype="http://schema.org/Article">
  
  
  
  <div class="post-block">
    <link itemprop="mainEntityOfPage" href="http://smallmuou.gitee.io/blog/blog/2015/10/27/2015-10-27-查看iOS设备各系统比率/">

    <span hidden itemprop="author" itemscope itemtype="http://schema.org/Person">
      <meta itemprop="name" content="smallmuou">
      <meta itemprop="description" content="">
      <meta itemprop="image" content="/blog/images/avatar.gif">
    </span>

    <span hidden itemprop="publisher" itemscope itemtype="http://schema.org/Organization">
      <meta itemprop="name" content="smallmuou's blog">
    </span>

    
      <header class="post-header">

        
        
          <h1 class="post-title" itemprop="name headline">
                
                <a class="post-title-link" href="/blog/2015/10/27/2015-10-27-查看iOS设备各系统比率/" itemprop="url">查看iOS设备各系统比率</a></h1>
        

        <div class="post-meta">
          <span class="post-time">
            
              <span class="post-meta-item-icon">
                <i class="fa fa-calendar-o"></i>
              </span>
              
                <span class="post-meta-item-text">发表于</span>
              
              <time title="创建于" itemprop="dateCreated datePublished" datetime="2015-10-27T00:00:00+08:00">
                2015-10-27
              </time>
            

            

            
          </span>

          
            <span class="post-category" >
            
              <span class="post-meta-divider">|</span>
            
              <span class="post-meta-item-icon">
                <i class="fa fa-folder-o"></i>
              </span>
              
                <span class="post-meta-item-text">分类于</span>
              
              
                <span itemprop="about" itemscope itemtype="http://schema.org/Thing">
                  <a href="/blog/categories/IOS/" itemprop="url" rel="index">
                    <span itemprop="name">IOS</span>
                  </a>
                </span>

                
                
              
            </span>
          

          

          
          

          

          

          

        </div>
      </header>
    

    
    
    
    <div class="post-body" itemprop="articleBody">

      
      

      
        
          
            <p>点击<a href="https://developer.apple.com/support/app-store/" target="_blank" rel="noopener">这里</a>查看iOS设备各系统占用比率</p>

          
        
      
    </div>
    
    
    

    

    

    

    <footer class="post-footer">
      

      

      

      
      
        <div class="post-eof"></div>
      
    </footer>
  </div>
  
  
  
  </article>


    
      

  

  
  
  

  <article class="post post-type-normal" itemscope itemtype="http://schema.org/Article">
  
  
  
  <div class="post-block">
    <link itemprop="mainEntityOfPage" href="http://smallmuou.gitee.io/blog/blog/2015/10/23/2015-10-23-悦读FM iOS客户端发布/">

    <span hidden itemprop="author" itemscope itemtype="http://schema.org/Person">
      <meta itemprop="name" content="smallmuou">
      <meta itemprop="description" content="">
      <meta itemprop="image" content="/blog/images/avatar.gif">
    </span>

    <span hidden itemprop="publisher" itemscope itemtype="http://schema.org/Organization">
      <meta itemprop="name" content="smallmuou's blog">
    </span>

    
      <header class="post-header">

        
        
          <h1 class="post-title" itemprop="name headline">
                
                <a class="post-title-link" href="/blog/2015/10/23/2015-10-23-悦读FM iOS客户端发布/" itemprop="url">悦读FM iOS客户端发布</a></h1>
        

        <div class="post-meta">
          <span class="post-time">
            
              <span class="post-meta-item-icon">
                <i class="fa fa-calendar-o"></i>
              </span>
              
                <span class="post-meta-item-text">发表于</span>
              
              <time title="创建于" itemprop="dateCreated datePublished" datetime="2015-10-23T00:00:00+08:00">
                2015-10-23
              </time>
            

            

            
          </span>

          
            <span class="post-category" >
            
              <span class="post-meta-divider">|</span>
            
              <span class="post-meta-item-icon">
                <i class="fa fa-folder-o"></i>
              </span>
              
                <span class="post-meta-item-text">分类于</span>
              
              
                <span itemprop="about" itemscope itemtype="http://schema.org/Thing">
                  <a href="/blog/categories/IOS/" itemprop="url" rel="index">
                    <span itemprop="name">IOS</span>
                  </a>
                </span>

                
                
              
            </span>
          

          

          
          

          

          

          

        </div>
      </header>
    

    
    
    
    <div class="post-body" itemprop="articleBody">

      
      

      
        
          
            <p>经过2周漫长的等待，悦读FM v1.0.0 iOS客户端终于审核通过了，这里给出链接:<a href="https://appsto.re/cn/-9iG-.i" target="_blank" rel="noopener">https://appsto.re/cn/-9iG-.i</a></p>
<p><img src="http://7ximmr.com1.z0.glb.clouddn.com/yuedu-apple-store-qrcode.png" alt="image"></p>
<p>欢迎大家使用~</p>

          
        
      
    </div>
    
    
    

    

    

    

    <footer class="post-footer">
      

      

      

      
      
        <div class="post-eof"></div>
      
    </footer>
  </div>
  
  
  
  </article>


    
      

  

  
  
  

  <article class="post post-type-normal" itemscope itemtype="http://schema.org/Article">
  
  
  
  <div class="post-block">
    <link itemprop="mainEntityOfPage" href="http://smallmuou.gitee.io/blog/blog/2015/10/22/2015-10-22-XCode之ARC模式/">

    <span hidden itemprop="author" itemscope itemtype="http://schema.org/Person">
      <meta itemprop="name" content="smallmuou">
      <meta itemprop="description" content="">
      <meta itemprop="image" content="/blog/images/avatar.gif">
    </span>

    <span hidden itemprop="publisher" itemscope itemtype="http://schema.org/Organization">
      <meta itemprop="name" content="smallmuou's blog">
    </span>

    
      <header class="post-header">

        
        
          <h1 class="post-title" itemprop="name headline">
                
                <a class="post-title-link" href="/blog/2015/10/22/2015-10-22-XCode之ARC模式/" itemprop="url">XCode之ARC模式</a></h1>
        

        <div class="post-meta">
          <span class="post-time">
            
              <span class="post-meta-item-icon">
                <i class="fa fa-calendar-o"></i>
              </span>
              
                <span class="post-meta-item-text">发表于</span>
              
              <time title="创建于" itemprop="dateCreated datePublished" datetime="2015-10-22T00:00:00+08:00">
                2015-10-22
              </time>
            

            

            
          </span>

          
            <span class="post-category" >
            
              <span class="post-meta-divider">|</span>
            
              <span class="post-meta-item-icon">
                <i class="fa fa-folder-o"></i>
              </span>
              
                <span class="post-meta-item-text">分类于</span>
              
              
                <span itemprop="about" itemscope itemtype="http://schema.org/Thing">
                  <a href="/blog/categories/IOS/" itemprop="url" rel="index">
                    <span itemprop="name">IOS</span>
                  </a>
                </span>

                
                
              
            </span>
          

          

          
          

          

          

          

        </div>
      </header>
    

    
    
    
    <div class="post-body" itemprop="articleBody">

      
      

      
        
          
            <p>先来看一段ARC代码</p>
<pre>
objB = objA;
objC = objA;
</pre>
经过两个赋值后，会发现objA的对象引用+2了，很神奇吧，仅仅只是一个赋值语句，就能把objA对象的引用+2；一向自认为c基础扎实的我，认为有点不可思议，甚至有时会认为此处引用根本没有增加，但没有增加的说法似乎又不同，于是Google下，发现这是编译器在搞鬼，这一点是没有想到的. 此处终于理解了“ARC是编译器特性，而不是运行时特性”;既然知道了是编译器在搞鬼，那么我来简单地模拟下编译器的工作流程.
<pre>
确认代码是否处于ARC模式 -> 当有对象赋值时，会根据相应变量的特性（weak、strong...）进行相应的代码修改

针对上述代码:(这里假设strong类型)，经过编译器转换后，代码如下:

objB = [objA retain]
objC = [objA retain]

</pre>

<p>理解了上述原因，我们就大致理解了ARC的奥妙，当然ARC模式也有些坑,特别是针对block，详见我的另一篇文章《<a href="http://wenva.github.io/ios/2015/10/09/ObjC%E4%B9%8BBlock%E8%A7%A3%E8%AF%BB.html" target="_blank" rel="noopener">ObjC之Block解读</a>》</p>

          
        
      
    </div>
    
    
    

    

    

    

    <footer class="post-footer">
      

      

      

      
      
        <div class="post-eof"></div>
      
    </footer>
  </div>
  
  
  
  </article>


    
      

  

  
  
  

  <article class="post post-type-normal" itemscope itemtype="http://schema.org/Article">
  
  
  
  <div class="post-block">
    <link itemprop="mainEntityOfPage" href="http://smallmuou.gitee.io/blog/blog/2015/10/09/2015-10-09-ObjC之Block解读/">

    <span hidden itemprop="author" itemscope itemtype="http://schema.org/Person">
      <meta itemprop="name" content="smallmuou">
      <meta itemprop="description" content="">
      <meta itemprop="image" content="/blog/images/avatar.gif">
    </span>

    <span hidden itemprop="publisher" itemscope itemtype="http://schema.org/Organization">
      <meta itemprop="name" content="smallmuou's blog">
    </span>

    
      <header class="post-header">

        
        
          <h1 class="post-title" itemprop="name headline">
                
                <a class="post-title-link" href="/blog/2015/10/09/2015-10-09-ObjC之Block解读/" itemprop="url">ObjC之Block解读</a></h1>
        

        <div class="post-meta">
          <span class="post-time">
            
              <span class="post-meta-item-icon">
                <i class="fa fa-calendar-o"></i>
              </span>
              
                <span class="post-meta-item-text">发表于</span>
              
              <time title="创建于" itemprop="dateCreated datePublished" datetime="2015-10-09T00:00:00+08:00">
                2015-10-09
              </time>
            

            

            
          </span>

          
            <span class="post-category" >
            
              <span class="post-meta-divider">|</span>
            
              <span class="post-meta-item-icon">
                <i class="fa fa-folder-o"></i>
              </span>
              
                <span class="post-meta-item-text">分类于</span>
              
              
                <span itemprop="about" itemscope itemtype="http://schema.org/Thing">
                  <a href="/blog/categories/IOS/" itemprop="url" rel="index">
                    <span itemprop="name">IOS</span>
                  </a>
                </span>

                
                
              
            </span>
          

          

          
          

          

          

          

        </div>
      </header>
    

    
    
    
    <div class="post-body" itemprop="articleBody">

      
      

      
        
          
            <h3 id="1-类型"><a href="#1-类型" class="headerlink" title="1. 类型"></a>1. 类型</h3><p>根据block在内存中的位置，分为如下三种</p>
<ul>
<li>NSGlobalBlock<ul>
<li>位于text段</li>
<li>不引用外部成员变量或局部变量（引用全局或静态也是NSGlobalBlock）<pre>
void (^block)(int a, int b) = ^(int a, int b){
//此处除了形参，不能使用外部变量
int c = a+b;
};</pre></li>
</ul>
</li>
<li>NSStackBlock<ul>
<li>位于栈内存</li>
<li>在函数中直接通过^{}定义的</li>
<li>不管block是否使用外部变量，都是NSStackBlock<pre>
NSLog(@"block = %@", ^{
  //此处不管是否访问外部变量，都是NSStackBlock
})</pre></li>
</ul>
</li>
<li>NSMallocBlock<ul>
<li>位于堆内存</li>
<li>引用外部变量</li>
<li>ARC模式下会将block从栈拷贝到堆上，而MRC中需要使用copy<pre>
int c;
void (^block)(int a, int b) = ^(int a, int b){
//此处引用了外部变量c
int d = c+a+b;
};</pre>

</li>
</ul>
</li>
</ul>
<h3 id="2-引用外部变量-针对NSStackBlock、NSMallocBlock"><a href="#2-引用外部变量-针对NSStackBlock、NSMallocBlock" class="headerlink" title="2 引用外部变量(针对NSStackBlock、NSMallocBlock)"></a>2 引用外部变量(针对NSStackBlock、NSMallocBlock)</h3><h4 id="2-1-引用外部基础类型变量"><a href="#2-1-引用外部基础类型变量" class="headerlink" title="2.1 引用外部基础类型变量"></a>2.1 引用外部基础类型变量</h4><pre>
@interface TestViewController () {
    int _count; //成员变量
}
@end

...

int g_count = 100; //全局变量

- (void)test {
    ....

    static int s_count = 100; //静态变量
    int count = 101; //局部变量
    NSLog(@"g_count= %p", &g_count);
    NSLog(@"s_count= %p", &s_count);
    NSLog(@"_count = %p", &_count);
    NSLog(@"count= %p", &count);
    ^{
        NSLog(@"block g_count= %p", &g_count);
        NSLog(@"block s_count= %p", &s_count);
        NSLog(@"block _count = %p", &_count);
        NSLog(@"block count= %p", &count);
    }();
    ...
}
</pre>
输出:
<pre>
2015-10-09 23:09:55.564 BlockTest[64349:778572] g_count= 0x1077d1390
2015-10-09 23:09:55.565 BlockTest[64349:778572] s_count= 0x1077d1394
2015-10-09 23:09:55.565 BlockTest[64349:778572] _count = 0x7fe240ea4478
2015-10-09 23:09:55.565 BlockTest[64349:778572] count= 0x7fff5842ed5c
2015-10-09 23:09:55.565 BlockTest[64349:778572] block g_count= 0x1077d1390
2015-10-09 23:09:55.565 BlockTest[64349:778572] block s_count= 0x1077d1394
2015-10-09 23:09:55.566 BlockTest[64349:778572] block _count = 0x7fe240ea4478
2015-10-09 23:09:55.566 BlockTest[64349:778572] block count= 0x7fff5842ed58
</pre>

<ul>
<li>对于局部变量，block将会对其进行copy</li>
<li>static变量、全局变量，block不对其进行copy</li>
</ul>
<h4 id="2-2-外部对象类型变量"><a href="#2-2-外部对象类型变量" class="headerlink" title="2.2 外部对象类型变量"></a>2.2 外部对象类型变量</h4><h5 id="MRC模式下"><a href="#MRC模式下" class="headerlink" title="MRC模式下"></a>MRC模式下</h5><ul>
<li>全局对象、静态对象，在block copy，不会进行retain</li>
<li>成员变量，在block copy 不会对成员变量进行retain，<code>但是会对self进行retain</code></li>
<li>局部变量，在block copy 会进行retain</li>
</ul>
<h5 id="ARC模式下"><a href="#ARC模式下" class="headerlink" title="ARC模式下"></a>ARC模式下</h5><ul>
<li>局部变量，block会copy其指针，并强引用一次</li>
<li>静态变量、全局变量会强引用一次</li>
<li>当block被释放，则相应的引用减1</li>
<li>成员变量，在block copy 不会对成员变量进行retain，<code>但是会对self进行retain</code></li>
</ul>
<h3 id="3-注意事项"><a href="#3-注意事项" class="headerlink" title="3. 注意事项"></a>3. 注意事项</h3><ul>
<li>与其他objc对象不同，block默认是在栈上分配的，因此需要注意copy  <pre>
  “As an optimization, block storage starts out on the stack—just like blocks     themselves do.”</pre></li>
<li>NSSet和NSArray 初始化(arrayWithObjects, initWithObjects)只对第一个block进行copy(验证了下字典对象是ok的)  <pre>
  [NSMutableArray arrayWithObjects:
          ^{ NSLog(@"this is block 1:%i", num); }, //NSMallocBlock
          ^{ NSLog(@"this is block 1:%i", num); }, //NSStackBlock
          nil];</pre></li>
<li><p>循环引用</p>
   <pre>
  //如下代码将会导致循环引用
  self.block = ^{
      //此处对成员变量_testObject1进行了引用，会导致对self进行了retain(参考2.2)
      NSLog(@"block ==========%@", _testObject1);
  };</pre>

<ul>
<li>此处解决方法有<ul>
<li>(1) self.block = nil</li>
<li>(2) 使用weak或者__unsafe_unretained<pre>
__weak typeof(self) weakSelf = self;
//__unsafe_unretained typeof(self) weakSelf = self;
self.block = ^{
  NSLog(@"block ==========%@", weakSelf.testObject1);
};</pre>

</li>
</ul>
</li>
</ul>
</li>
</ul>

          
        
      
    </div>
    
    
    

    

    

    

    <footer class="post-footer">
      

      

      

      
      
        <div class="post-eof"></div>
      
    </footer>
  </div>
  
  
  
  </article>


    
      

  

  
  
  

  <article class="post post-type-normal" itemscope itemtype="http://schema.org/Article">
  
  
  
  <div class="post-block">
    <link itemprop="mainEntityOfPage" href="http://smallmuou.gitee.io/blog/blog/2015/07/29/2015-07-29-iOS HTML图片本地预览/">

    <span hidden itemprop="author" itemscope itemtype="http://schema.org/Person">
      <meta itemprop="name" content="smallmuou">
      <meta itemprop="description" content="">
      <meta itemprop="image" content="/blog/images/avatar.gif">
    </span>

    <span hidden itemprop="publisher" itemscope itemtype="http://schema.org/Organization">
      <meta itemprop="name" content="smallmuou's blog">
    </span>

    
      <header class="post-header">

        
        
          <h1 class="post-title" itemprop="name headline">
                
                <a class="post-title-link" href="/blog/2015/07/29/2015-07-29-iOS HTML图片本地预览/" itemprop="url">iOS HTML图片本地预览</a></h1>
        

        <div class="post-meta">
          <span class="post-time">
            
              <span class="post-meta-item-icon">
                <i class="fa fa-calendar-o"></i>
              </span>
              
                <span class="post-meta-item-text">发表于</span>
              
              <time title="创建于" itemprop="dateCreated datePublished" datetime="2015-07-29T00:00:00+08:00">
                2015-07-29
              </time>
            

            

            
          </span>

          
            <span class="post-category" >
            
              <span class="post-meta-divider">|</span>
            
              <span class="post-meta-item-icon">
                <i class="fa fa-folder-o"></i>
              </span>
              
                <span class="post-meta-item-text">分类于</span>
              
              
                <span itemprop="about" itemscope itemtype="http://schema.org/Thing">
                  <a href="/blog/categories/IOS/" itemprop="url" rel="index">
                    <span itemprop="name">IOS</span>
                  </a>
                </span>

                
                
              
            </span>
          

          

          
          

          

          

          

        </div>
      </header>
    

    
    
    
    <div class="post-body" itemprop="articleBody">

      
      

      
        
          
            <h2 id="1-引言"><a href="#1-引言" class="headerlink" title="1.引言"></a>1.引言</h2><p>　相信用过苹果手机的童鞋，会发现很多新闻类的应用，都可以实现HTML图片本地预览，那么这是如何实现的呢？本文将深入阐述其中的原理.</p>
<p>　　关于此功能，我还实现了一个DEMO，大家可以点击此<a href="https://github.com/smallmuou/PPHTMLImagePreviewDemo" target="_blank" rel="noopener">访问更详细内容</a><br>　　<br><br> 　<img src="http://images0.cnblogs.com/blog2015/618689/201507/281746477031029.png" alt="image"><br>　　<img src="http://images0.cnblogs.com/blog2015/618689/201507/281746583287949.png" alt="image">
　
　　　</p>
<h2 id="2-原理"><a href="#2-原理" class="headerlink" title="2.原理"></a>2.原理</h2><p>  接触过web开发的人，就了解与html元素交互都是通过javascript进行的，比如点击、滑动等，比如点击<img>标签的响应代码如下<br>  <pre><br>var img = document.getElementById(‘test’);<br>img.onclick = function() {<br>    do some thing<br>}<br>  </pre></p>
<p>  顺着这个思路往下想，就可以推测出，在iOS中实现点击图片本地预览，也应该是跟javascript交互的，于是问题转换成了javascript与objc的交互. 关于javascript与objc的交互，google下一大堆，看似很复杂，其实非常简单，我这里简单阐述下，大家都知道在iOS中是用UIWebView控件来显示HTML的，那么javascript与objc要实现交互，桥梁必须是UIWebView，通过查看UIWebView提供的相关接口，可以找到如下接口:</p>
<pre>
- (NSString *)stringByEvaluatingJavaScriptFromString:(NSString *)script
- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType;
</pre>

<p>第一个接口一目了然，即执行javascript，于是就打通了objc到javacript的路，那么javascript到objc呢？答案就是第二个接口，因为当html点击一个新链接就会执行该接口来判定是否要进入新链接，于是只有让javascript去改变href从而来触发第二个接口的调用，就能打通了javascript到objc的路，参数当然存放于request的href中。</p>
<p>　　在了解了javascript与objc的交互，还有一个小问题，即何时去执行javascript？查看UIWebView文档，发现可以在如下接口中调用</p>
<pre>
- (void)webViewDidFinishLoad:(UIWebView *)webView;
</pre>

<h2 id="3-实现"><a href="#3-实现" class="headerlink" title="3. 实现"></a>3. 实现</h2><p>在webViewDidFinishLoad执行如下javascript代码，大致功能是遍历html中所有&lt; img&gt;元素，并添加onclick事件，在onclick中修改window.location.href，以触发UIWebView调用webView:shouldStartLoadWithRequest:navigationType接口，参数是image-preview:+&lt; img&gt;标签的src属性</p>
<pre>
function assignImageClickAction() {
var imgs = document.getElementsByTagName('img');
var length = imgs.length;
for (var i = 0; i < length; i++) {
    img = imgs[i];
    img.onclick = function() {
        window.location.href = 'image-preview:' + this.src
    }
}
}
assignImageClickAction();
</pre>

<p>上述javascript可以通过压缩，实际代码如下</p>
<pre>
- (void)webViewDidFinishLoad:(UIWebView *)webView {
    [self.webView stringByEvaluatingJavaScriptFromString:@"function assignImageClickAction(){var imgs=document.getElementsByTagName('img');var length=imgs.length;for(var i=0;i < length;i++){img=imgs[i];img.onclick=function(){window.location.href='image-preview:'+this.src}}}"];
    [self.webView stringByEvaluatingJavaScriptFromString:@"assignImageClickAction();"];
}
</pre>

<p>当用户点击<img>会触发如下代码</p>
<pre>
- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType {
    //预览图片
    if ([request.URL.scheme isEqualToString:@"image-preview"]) {
        NSString* path = [request.URL.absoluteString substringFromIndex:[@"image-preview:" length]];
        path = [path stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
        [self.imageView setImageWithURL:[NSURL URLWithString:path] placeholderImage:[UIImage imageNamed:@"default"] usingActivityIndicatorStyle:UIActivityIndicatorViewStyleWhite];

        [UIView animateWithDuration:0.2f animations:^{
            self.imageView.alpha = 1.0f;
        }];

        return NO;
    }
    return YES;
}
</pre>

<h2 id="综述"><a href="#综述" class="headerlink" title="综述"></a>综述</h2><p>至此，大家应该明白了iOS APP点击HTML实现本地预览的原理，当然这仅仅只是个开始，你可以修改window.location.href传递的值，从而实现更多功能，比如小图、大图预览等，大家可以到<a href="https://github.com/smallmuou/PPHTMLImagePreviewDemo" target="_blank" rel="noopener">这里下载源码](访问更详细内容</a>.</p>

          
        
      
    </div>
    
    
    

    

    

    

    <footer class="post-footer">
      

      

      

      
      
        <div class="post-eof"></div>
      
    </footer>
  </div>
  
  
  
  </article>


    
      

  

  
  
  

  <article class="post post-type-normal" itemscope itemtype="http://schema.org/Article">
  
  
  
  <div class="post-block">
    <link itemprop="mainEntityOfPage" href="http://smallmuou.gitee.io/blog/blog/2015/07/27/2015-07-27-ObjC转向Swift若干tips/">

    <span hidden itemprop="author" itemscope itemtype="http://schema.org/Person">
      <meta itemprop="name" content="smallmuou">
      <meta itemprop="description" content="">
      <meta itemprop="image" content="/blog/images/avatar.gif">
    </span>

    <span hidden itemprop="publisher" itemscope itemtype="http://schema.org/Organization">
      <meta itemprop="name" content="smallmuou's blog">
    </span>

    
      <header class="post-header">

        
        
          <h1 class="post-title" itemprop="name headline">
                
                <a class="post-title-link" href="/blog/2015/07/27/2015-07-27-ObjC转向Swift若干tips/" itemprop="url">ObjC转向Swift若干tips</a></h1>
        

        <div class="post-meta">
          <span class="post-time">
            
              <span class="post-meta-item-icon">
                <i class="fa fa-calendar-o"></i>
              </span>
              
                <span class="post-meta-item-text">发表于</span>
              
              <time title="创建于" itemprop="dateCreated datePublished" datetime="2015-07-27T00:00:00+08:00">
                2015-07-27
              </time>
            

            

            
          </span>

          
            <span class="post-category" >
            
              <span class="post-meta-divider">|</span>
            
              <span class="post-meta-item-icon">
                <i class="fa fa-folder-o"></i>
              </span>
              
                <span class="post-meta-item-text">分类于</span>
              
              
                <span itemprop="about" itemscope itemtype="http://schema.org/Thing">
                  <a href="/blog/categories/IOS/" itemprop="url" rel="index">
                    <span itemprop="name">IOS</span>
                  </a>
                </span>

                
                
              
            </span>
          

          

          
          

          

          

          

        </div>
      </header>
    

    
    
    
    <div class="post-body" itemprop="articleBody">

      
      

      
        
          
            <ul>
<li>不分头文件和实现文件，而是集合到.swift文件</li>
<li>类型对象化（类似于java） Int、Float、Double、Bool、Character</li>
<li>let 定义常量； len pi = 3.14</li>
<li><p>var hello :NSString ?</p>
<ul>
<li>var 定义变量<code>var hello :NSString = @&quot;1212&quot;</code></li>
<li>: 指定变量类型</li>
<li>? 表示optional，即该变量可能为nil; 调用时必须加? 如 <code>hello?.length</code></li>
<li>! 表示该变量一定不为nil，否则crash</li>
</ul>
</li>
<li><p>@”hello”不存在了,变回了”hello” 如<code>var hello :NSString = &quot;hello&quot;</code></p>
</li>
<li>可以使用+来拼接字符串 <code>&quot;hello&quot;+&quot;world&quot;</code></li>
<li>使用()可以在字符串插入变量 <code>let lang = &quot;swift&quot;; &quot;hello \(lang) world&quot;</code></li>
<li>class 定义类</li>
<li><p>func 定义函数</p>
<ul>
<li>func xxxx(xxx …) -&gt; 返回类型</li>
</ul>
</li>
<li><p>println 带换行的print</p>
</li>
<li>as 类型转换 “当作”</li>
</ul>

          
        
      
    </div>
    
    
    

    

    

    

    <footer class="post-footer">
      

      

      

      
      
        <div class="post-eof"></div>
      
    </footer>
  </div>
  
  
  
  </article>


    
      

  

  
  
  

  <article class="post post-type-normal" itemscope itemtype="http://schema.org/Article">
  
  
  
  <div class="post-block">
    <link itemprop="mainEntityOfPage" href="http://smallmuou.gitee.io/blog/blog/2015/07/27/2015-07-27-推荐一个MAC上看在线视频不卡工具（还带去广告）/">

    <span hidden itemprop="author" itemscope itemtype="http://schema.org/Person">
      <meta itemprop="name" content="smallmuou">
      <meta itemprop="description" content="">
      <meta itemprop="image" content="/blog/images/avatar.gif">
    </span>

    <span hidden itemprop="publisher" itemscope itemtype="http://schema.org/Organization">
      <meta itemprop="name" content="smallmuou's blog">
    </span>

    
      <header class="post-header">

        
        
          <h1 class="post-title" itemprop="name headline">
                
                <a class="post-title-link" href="/blog/2015/07/27/2015-07-27-推荐一个MAC上看在线视频不卡工具（还带去广告）/" itemprop="url">推荐一个MAC上看在线视频不卡工具（还带去广告）</a></h1>
        

        <div class="post-meta">
          <span class="post-time">
            
              <span class="post-meta-item-icon">
                <i class="fa fa-calendar-o"></i>
              </span>
              
                <span class="post-meta-item-text">发表于</span>
              
              <time title="创建于" itemprop="dateCreated datePublished" datetime="2015-07-27T00:00:00+08:00">
                2015-07-27
              </time>
            

            

            
          </span>

          
            <span class="post-category" >
            
              <span class="post-meta-divider">|</span>
            
              <span class="post-meta-item-icon">
                <i class="fa fa-folder-o"></i>
              </span>
              
                <span class="post-meta-item-text">分类于</span>
              
              
                <span itemprop="about" itemscope itemtype="http://schema.org/Thing">
                  <a href="/blog/categories/工具/" itemprop="url" rel="index">
                    <span itemprop="name">工具</span>
                  </a>
                </span>

                
                
              
            </span>
          

          

          
          

          

          

          

        </div>
      </header>
    

    
    
    
    <div class="post-body" itemprop="articleBody">

      
      

      
        
          
            <p>详情猛戳<a href="http://zythum.sinaapp.com/youkuhtml5playerbookmark/" target="_blank" rel="noopener">这里</a></p>

          
        
      
    </div>
    
    
    

    

    

    

    <footer class="post-footer">
      

      

      

      
      
        <div class="post-eof"></div>
      
    </footer>
  </div>
  
  
  
  </article>


    
  </section>

  
  <nav class="pagination">
    <a class="extend prev" rel="prev" href="/blog/page/14/"><i class="fa fa-angle-left"></i></a><a class="page-number" href="/blog/">1</a><span class="space">&hellip;</span><a class="page-number" href="/blog/page/14/">14</a><span class="page-number current">15</span><a class="page-number" href="/blog/page/16/">16</a><span class="space">&hellip;</span><a class="page-number" href="/blog/page/20/">20</a><a class="extend next" rel="next" href="/blog/page/16/"><i class="fa fa-angle-right"></i></a>
  </nav>



          </div>
          


          

        </div>
        
          
  
  <div class="sidebar-toggle">
    <div class="sidebar-toggle-line-wrap">
      <span class="sidebar-toggle-line sidebar-toggle-line-first"></span>
      <span class="sidebar-toggle-line sidebar-toggle-line-middle"></span>
      <span class="sidebar-toggle-line sidebar-toggle-line-last"></span>
    </div>
  </div>

  <aside id="sidebar" class="sidebar">
    
    <div class="sidebar-inner">

      

      

      <section class="site-overview-wrap sidebar-panel sidebar-panel-active">
        <div class="site-overview">
          <div class="site-author motion-element" itemprop="author" itemscope itemtype="http://schema.org/Person">
            
              <p class="site-author-name" itemprop="name">smallmuou</p>
              <p class="site-description motion-element" itemprop="description"></p>
          </div>

          <nav class="site-state motion-element">

            
              <div class="site-state-item site-state-posts">
              
                <a href="/blog/archives/">
              
                  <span class="site-state-item-count">197</span>
                  <span class="site-state-item-name">日志</span>
                </a>
              </div>
            

            
              
              
              <div class="site-state-item site-state-categories">
                <a href="/blog/categories/index.html">
                  <span class="site-state-item-count">12</span>
                  <span class="site-state-item-name">分类</span>
                </a>
              </div>
            

            

          </nav>

          

          
            <div class="links-of-author motion-element">
                
                  <span class="links-of-author-item">
                    <a href="https://github.com/smallmuou" target="_blank" title="GitHub">
                      
                        <i class="fa fa-fw fa-globe"></i>GitHub</a>
                  </span>
                
            </div>
          

          
          

          
          

          

        </div>
      </section>

      

      

    </div>
  </aside>


        
      </div>
    </main>

    <footer id="footer" class="footer">
      <div class="footer-inner">
        <div class="copyright">&copy; <span itemprop="copyrightYear">2020</span>
  <span class="with-love">
    <i class="fa fa-user"></i>
  </span>
  <span class="author" itemprop="copyrightHolder">smallmuou</span>

  
</div>

    <script async src="https://busuanzi.ibruce.info/busuanzi/2.3/busuanzi.pure.mini.js"></script>

    <span id="busuanzi_container_site_pv">总访问量<span id="busuanzi_value_site_pv"></span>次</span>
    <span class="post-meta-divider">|</span>



  <div class="powered-by">由 <a class="theme-link" target="_blank" href="https://hexo.io">Hexo</a> 强力驱动</div>



  <span class="post-meta-divider">|</span>



  <div class="theme-info">主题 &mdash; <a class="theme-link" target="_blank" href="https://github.com/iissnan/hexo-theme-next">NexT.Muse</a> v5.1.4</div>




        







        
      </div>
    </footer>

    
      <div class="back-to-top">
        <i class="fa fa-arrow-up"></i>
        
      </div>
    

    

  </div>

  

<script type="text/javascript">
  if (Object.prototype.toString.call(window.Promise) !== '[object Function]') {
    window.Promise = null;
  }
</script>









  












  
  
    <script type="text/javascript" src="/blog/lib/jquery/index.js?v=2.1.3"></script>
  

  
  
    <script type="text/javascript" src="/blog/lib/fastclick/lib/fastclick.min.js?v=1.0.6"></script>
  

  
  
    <script type="text/javascript" src="/blog/lib/jquery_lazyload/jquery.lazyload.js?v=1.9.7"></script>
  

  
  
    <script type="text/javascript" src="/blog/lib/velocity/velocity.min.js?v=1.2.1"></script>
  

  
  
    <script type="text/javascript" src="/blog/lib/velocity/velocity.ui.min.js?v=1.2.1"></script>
  

  
  
    <script type="text/javascript" src="/blog/lib/fancybox/source/jquery.fancybox.pack.js?v=2.1.5"></script>
  


  


  <script type="text/javascript" src="/blog/js/src/utils.js?v=5.1.4"></script>

  <script type="text/javascript" src="/blog/js/src/motion.js?v=5.1.4"></script>



  
  

  

  


  <script type="text/javascript" src="/blog/js/src/bootstrap.js?v=5.1.4"></script>



  


  




	





  





  












  





  

  

  

  
  

  

  

  

</body>
</html>
